// 云函数入口文件
const cloud = require('wx-server-sdk')


// 1. 如果 init 时不传 env 参数，后续 API 调用将默认请求到第一个创建的环境，但这种方式并不总是预期的，因此这种方式已废弃，请务必明确传入 env 参数
// 2. 注意：env 设置只会决定本次云函数 API 调用的云环境，并不会决定接下来其他被调云函数中的 API 调用的环境，在其他被调云函数中需要通过 init 方法重新设置环境。
// 3. 建议：在设置 env 时指定 cloud.DYNAMIC_CURRENT_ENV 常量 (需 SDK v1.1.0 或以上) ，这样云函数内发起数据库请求、存储请求或调用其他云函数的时候，默认请求的云环境就是云函数当前所在的环境：

// 云函数属于管理端， 在云函数中运行的代码拥有不受限的数据库读写权限和云文件读写权限。 需特别注意， 云函数运行环境即是管理端
cloud.init({
  env: cloud.DYNAMIC_CURRENT_ENV
})


// 云函数入口函数
exports.main = async (event, context) => {
  // 1.小程序调用云端才有, 其他情况调用没有openid直接报错
  const openid = cloud.getWXContext().OPENID
  if (!(openid && openid === event.openid)) {
    return {
      errCode: 401,
      errorMsg: '未登录，没有权限！'
    }
  }

  // 2.校验客户端数据
  const db = cloud.database()
  let errCheck
  let clientData = event.data
  // 新增openid,创建时间,更新时间
  let databaseData = {
    openid,
    nickName: clientData.nickName || '',
    avatarUrl: clientData.avatarUrl || '',
    creat_time: new Date().getTime(),
    update_time: new Date().getTime(),
    bgImg: clientData.bgImg || '',
    classifyList: clientData.classifyList || [],
    foodsList: clientData.foodsList || [],
    menuDesc: clientData.menuDesc || '',
    menuName: clientData.menuName || '',
    menuTips: clientData.menuTips || '',
    stepsList: clientData.stepsList || [],
    isChecked: true // 当前默认都是审核通过
  }
  if (!databaseData.bgImg) {
    errCheck = "请上传封面图！"
  }

  if (!databaseData.menuName) {
    errCheck = "请填写菜谱名称！"
  }

  if (!(databaseData.stepsList[0] && databaseData.stepsList[0].desc)) {
    errCheck = "至少填写一个步骤描述"
  }

  if (errCheck) {
    return {
      errorMsg: errCheck
    }
  }


  // 3.开始使用数据库语句
  const [err, success] = await awaitWrap(
    db.collection('menus').add({
      // data 字段表示需新增的 JSON 数据
      data: databaseData
    })
  )

  if (success) {
    return {
      msg: 'success'
    }
  } else {
    return {
      errorMsg: err
    }
  }


}

// await错误处理公共方法
const awaitWrap = (promise) => {
  return promise
    .then(success => [null, success])
    .catch(err => [err, null])
}